package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.PartJugadorService;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.jugador.Jugador;
import es.tikitaka.domain.jugador.PartJugador;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("partJugadorService")
public class PartJugadorServiceImpl implements PartJugadorService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public PartJugadorServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para listar todas las participaciones de jugadores en el sistema
	 * 
	 * @return lista de participaciones
	 */
	@SuppressWarnings("unchecked")
	public List<PartJugador> getList() {
		List<PartJugador> list = null;
		try {
			list = em.createQuery("select p from PartJugador p")
					.getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para listar todas las participaciones de un jugador a lo largo de
	 * su trayectoria
	 * 
	 * @param jugador
	 *            Jugador al que pertenecen las participaciones
	 * @return lista de participaciones del jugador
	 */
	@SuppressWarnings("unchecked")
	public List<PartJugador> getParticipaciones(Jugador jugador) {

		List<PartJugador> list = null;
		try {
			list = em
					.createQuery(
							"select p from PartJugador p left join fetch p.jugador j where j.id = ?1")
					.setParameter("1", jugador.getId()).getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para listar todas las participaciones de jugadores coincidentes
	 * con unos criterios de búsqueda
	 * 
	 * @param buscar
	 *            Cadena a buscar
	 * @param en
	 *            atributo donde buscar
	 * @param temporada
	 *            Temporada para la que buscar
	 * @return lista de participaciones de jugadores coincidentes con los
	 *         criterios
	 */
	@SuppressWarnings("unchecked")
	public List<PartJugador> buscarParticipacionesTemporada(String buscar,
			int en, Temporada temporada) {

		List<PartJugador> lista = null;

		try {
			if (en == 1) {
				lista = em
						.createQuery(
								"select p from PartJugador p left join fetch p.jugador j left join fetch p.temporada t where p.equipo is null and upper(j.apellidos) like upper('%'||?1||'%') and t.id = ?2 order by j.apellidos")
						.setParameter("1", buscar).setParameter("2",
								temporada.getId()).getResultList();
			} else {
				lista = em
						.createQuery(
								"select p from PartJugador p left join fetch p.jugador j left join fetch p.temporada t where p.equipo is null and upper(j.nombre) like upper('%'||?1||'%') and t.id = ?2 order by j.nombre")
						.setParameter("1", buscar).setParameter("2",
								temporada.getId()).getResultList();
			}
		} catch (RuntimeException e) {
			e.printStackTrace();
		}

		return lista;
	}

	/**
	 * Método para eliminar del sistema un participación de jugador dada
	 * 
	 * @param id
	 *            Id de la participación de jugador a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			PartJugador part = em.getReference(PartJugador.class, id);
			em.remove(part);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para guardar una participación de jugador en el sistema o las
	 * modificaciones sufridas por una participación ya existente
	 * 
	 * @param participacion
	 *            Participación de jugador a guardar
	 * @return estado el proceso (true or false)
	 */
	public boolean save(PartJugador participacion) {
		boolean correcto;
		try {
			em.persist(participacion);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
